package com.lewis.module.m2.listener;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.lewis.api.system.entity.BotQq;
import com.lewis.module.m2.api.bot.service.IBotQqService;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * 上下文更新事件（ContextRefreshedEvent）：该事件会在ApplicationContext被初始化或者更新时发布。也可以在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。
 * 上下文开始事件（ContextStartedEvent）：当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。
 * 上下文停止事件（ContextStoppedEvent）：当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。
 * 上下文关闭事件（ContextClosedEvent）：当ApplicationContext被关闭时触发该事件。容器被关闭时，其管理的所有单例Bean都被销毁。
 * 请求处理事件（RequestHandledEvent）：在Web应用中，当一个http请求（request）结束触发该事件。
 *
 * @author Lewis 398529803@qq.com 2022年8月8日, 008 21:32:14
 */
@Slf4j
@Component
public class CustomApplicationListener implements ApplicationListener<ApplicationEvent> {

	@Resource
	private IBotQqService botQqService;

	@Override
	public void onApplicationEvent(@NotNull ApplicationEvent event) {
		// 程序关闭时离线机器人
		if (event instanceof ContextClosedEvent) {
			log.info("对所有机器人做离线状态操作......");
			if (botQqService.update(
					new LambdaUpdateWrapper<BotQq>()
							.set(BotQq::getOnlineState, 0)
			)) {
				log.info("所有机器人成功离线。");
			} else {
				log.error("所有机器人未成功离线！");
			}
		}
	}
}
